<?php

/**
 * 文字自动换行算法
 * @param $card 画板
 * @param $pos 数组，top距离画板顶端的距离，fontsize文字的大小，width宽度，left距离左边的距离，hang_size行高
 * @param $str 要写的字符串
 * @param $iswrite  是否输出，ture，  花出文字，false只计算占用的高度
 * @return int 返回整个字符所占用的高度
 */

function draw_txt_to($card, $pos, $str, $iswrite=true)
{

    $_str_h = $pos["top"];
    $fontsize = $pos["fontsize"];
    $width = $pos["width"];
    $margin_lift = $pos["left"];
    $hang_size = $pos["hang_size"];
    $temp_string = "";
    $font_file = $pos["font"];
    $tp = 0;

    list($R,$G,$B) = explode(',', $pos['color']);

    $font_color = imagecolorallocate($card, $R, $G, $B);
    for ($i = 0; $i < mb_strlen($str); $i++) {

        $box = imagettfbbox($fontsize, 0, $font_file, $temp_string);
        $_string_length = $box[2] - $box[0];
        $temptext = mb_substr($str, $i, 1);

        $temp = imagettfbbox($fontsize, 0, $font_file, $temptext);

        if ($_string_length + $temp[2] - $temp[0] < $width) {//长度不够，字数不够，需要

            //继续拼接字符串。

            $temp_string .= mb_substr($str, $i, 1);

            if ($i == mb_strlen($str) - 1) {//是不是最后半行。不满一行的情况
                $_str_h += $hang_size;//计算整个文字换行后的高度。
                $tp++;//行数
                if ($iswrite) {//是否需要写入，核心绘制函数
                    imagettftext($card, $fontsize, 0, $margin_lift, $_str_h, $font_color, $font_file, $temp_string);
                }

            }
        } else {//一行的字数够了，长度够了。

//            打印输出，对字符串零时字符串置null
            $texts = mb_substr($str, $i, 1);//零时行的开头第一个字。

//            判断默认第一个字符是不是符号；
            $isfuhao = preg_match("/[\\pP]/u", $texts) ? true : false;//一行的开头这个字符，是不是标点符号
            if ($isfuhao) {//如果是标点符号，则添加在第一行的结尾
                $temp_string .= $texts;

//                判断如果是连续两个字符出现，并且两个丢失必须放在句末尾的，单独处理
                $f = mb_substr($str, $i + 1, 1);
                $fh = preg_match("/[\\pP]/u", $f) ? true : false;
                if ($fh) {
                    $temp_string .= $f;
                    $i++;
                }

            } else {
                $i--;
            }

            $tmp_str_len = mb_strlen($temp_string);
            $s = mb_substr($temp_string, $tmp_str_len-1, 1);//取零时字符串最后一位字符

                if (is_firstfuhao($s)) {//判断零时字符串的最后一个字符是不是可以放在见面
                    //讲最后一个字符用“_”代替。指针前移动一位。重新取被替换的字符。
                    $temp_string=rtrim($temp_string,$s);
                    $i--;
                }
//            }

//            计算行高，和行数。
            $_str_h += $hang_size;
            $tp++;
            if ($iswrite) {

                imagettftext($card, $fontsize, 0, $margin_lift, $_str_h, $font_color, $font_file, $temp_string);
            }
//           写完了改行，置null该行的临时字符串。
            $temp_string = "";
        }
    }

    return $tp * $hang_size;

}


function is_firstfuhao($str)
{
    $fuhaos = array("\"", "“", "'", "<", "《",);

    return in_array($str, $fuhaos);

}



/**
 * 生成宣传海报
 * @param array  参数,包括图片和文字
 * @param string  $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片
 * @return [type] [description]
 */
function createPoster($config=array(),$filename=""){


    //如果要看报什么错，可以先注释调这个header
    if(empty($filename)) header("content-type: image/jpeg");
    $imageDefault = array(
      'left'=>0,
      'top'=>0,
      'right'=>0,
      'bottom'=>0,
      'width'=>100,
      'height'=>100,
      'opacity'=>100
    );
    $textDefault = array(
      'text'=>'',
      'left'=>0,
      'top'=>0,
      'fontPath'=>'font/msyh.ttf',     //字体文件
      'wrap'=>false,
      'lineHeight'=>42, //行高1.4
      'fontSize'=>30,       //字号
      'fontColor'=>'255,255,255', //字体颜色
      'angle'=>0,
    );
    
    // $background = $config['background'];//海报最底层得背景
    // //背景方法
    // $backgroundInfo = getimagesize($background);
    // $backgroundFun = 'imagecreatefrom'.image_type_to_extension($backgroundInfo[2], false);
    // $background = $backgroundFun($background);
    // $backgroundWidth = imagesx($background);  //背景宽度
    // $backgroundHeight = imagesy($background);  //背景高度
    // $wrapCTX = imageCreatetruecolor($backgroundWidth,$backgroundHeight);
    // $color = imagecolorallocate($wrapCTX, 0, 0, 0);
    // imagefill($wrapCTX, 0, 0, $color);
    // // imageColorTransparent($wrapCTX, $color);  //颜色透明
    // imagecopyresampled($wrapCTX,$background,0,0,0,0,imagesx($background),imagesy($background),imagesx($background),imagesy($background));

    $wrap = $config['wrap'];//海报最底层得背景
    //背景方法
   
    $wrapWidth = $wrap['width'];  //背景宽度
    $wrapHeight = $wrap['height'];  //背景高度
    $wrapCTX = imageCreatetruecolor($wrapWidth,$wrapHeight);

    $bgColorArr = explode(',',$wrap['bgcolor']);
    $color = imagecolorallocate($wrapCTX, $bgColorArr[0], $bgColorArr[1], $bgColorArr[2]);
    imagefill($wrapCTX, 0, 0, $color);

    // imageColorTransparent($wrapCTX, $color);  //颜色透明

    //imagecopyresampled($wrapCTX,$background,0,0,0,0,imagesx($background),imagesy($background),imagesx($background),imagesy($background));



    //处理了图片
    if(!empty($config['image'])){
      foreach ($config['image'] as $key => $val) {
        $val = array_merge($imageDefault,$val);
        $info = getimagesize($val['url']);
        $function = 'imagecreatefrom'.image_type_to_extension($info[2], false);
        if($val['stream']){   //如果传的是字符串图像流
          $info = getimagesizefromstring($val['url']);
          $function = 'imagecreatefromstring';
        }
        var_dump($val['url']);
        $res = $function($val['url']);
        $resWidth = $info[0];
        $resHeight = $info[1];
        //建立画板 ，缩放图片至指定尺寸
        $canvas=imagecreatetruecolor($val['width'], $val['height']);
        imagefill($canvas, 0, 0, $color);
        //关键函数，参数（目标资源，源，目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h）
        imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'],$resWidth,$resHeight);
        $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']) - $val['width']:$val['left'];
        $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']) - $val['height']:$val['top'];
        //放置图像
        imagecopymerge($wrapCTX,$canvas, $val['left'],$val['top'],$val['right'],$val['bottom'],$val['width'],$val['height'],$val['opacity']);//左，上，右，下，宽度，高度，透明度
      }
    }
    //处理文字
    if(!empty($config['text'])){
      foreach ($config['text'] as $key => $val) {
        $val = array_merge($textDefault,$val);
        list($R,$G,$B) = explode(',', $val['fontColor']);
        $fontColor = imagecolorallocate($wrapCTX, $R, $G, $B);
        $val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']):$val['left'];
        $val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']):$val['top'];
        // Set the enviroment variable for GD
        putenv('GDFONTPATH=' . realpath('.'));

        $draw_conf = array('top'=>$val['top'],'fontsize'=>$val['fontSize'],'width'=>$wrap['width']-2*$val['left'],'left'=>$val['left'],'hang_size'=>$val['lineHeight'],'font'=>$val['fontPath'],'color'=>$val['fontColor']);

        if($val['wrap']){
            draw_txt_to($wrapCTX,$draw_conf,$val['text']);
            continue;
        }
        imagettftext($wrapCTX,$val['fontSize'],$val['angle'],$val['left'],$val['top'],$fontColor,$val['fontPath'],$val['text']);
      }
    }


    //生成图片
    if(!empty($filename)){
      $res = imagejpeg ($wrapCTX,$filename,90); //保存到本地
      imagedestroy($wrapCTX);
      if(!$res) return false;
      return $filename;
    }else{
      imagejpeg ($wrapCTX);     //在浏览器上显示
      imagedestroy($wrapCTX);
    }
  }